Belajar bagaimana aplikasi mengenali siapa kamu, menentukan apa hakmu, dan menjaga data tetap aman — dari Login hingga Mini Project School Management System.
Sembilan topik utama yang akan membawamu dari konsep keamanan dasar hingga membangun aplikasi bisnis nyata.
Di akhir bab, kamu akan membangun School Management System — sistem login multi-role lengkap dengan dashboard dan CRUD data sekolah.
Authentication = "Siapa kamu?" • Authorization = "Apa yang boleh kamu lakukan?"
Proses membuktikan identitas. Sistem memastikan kamu benar-benar orang yang kamu klaim — biasanya lewat email + password.
Setelah dikenali, sistem menentukan hak akses. Apakah kamu boleh masuk halaman admin? Boleh hapus data?
Langkah 1 — Authentication: di pintu depan, satpam memindai KTP-mu untuk memastikan kamu benar "Andi", bukan orang lain. Itu membuktikan siapa kamu.
Langkah 2 — Authorization: meski sudah dikenali, KTP-mu hanya bisa membuka Lantai 1. Ruang Admin & Brankas tetap terkunci karena kamu bukan admin. Itu menentukan apa hakmu.
👉 Intinya: dikenali dulu (Authentication), baru ditentukan boleh apa saja (Authorization).
HTTP itu "pelupa" — setiap request dianggap orang baru. Tiga benda ini membuat sistem ingat siapa kamu setelah login.
Data identitasmu disimpan di server. Browser hanya pegang ID-nya.
Sepotong data kecil disimpan di browser, dikirim otomatis tiap request.
"KTP digital" berisi info terenkripsi, dikirim di header request.
Session = gelang tangan event (panitia pegang daftar). Cookie = stiker nama di baju (selalu menempel). Token = e-ticket QR di HP (berisi data lengkap, tinggal scan). Ketiganya membuktikan "aku sudah bayar tiket".
Bagaimana sistem memproses login dari awal sampai kamu masuk dashboard.
Kunci utamanya ada di percabangan "Cek Email & Password". Jika cocok → sistem membuat "tanda pengenal" (session/token). Jika salah → kembali ke form dengan pesan error.
Controller yang menangani pendaftaran user baru dan proses login. Perhatikan: password selalu di-hash, tidak pernah disimpan apa adanya.
public function register(Request $req){
$data = $req->validate([
'name' => 'required|min:3',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
]);
$user = User::create([
'name' => $data['name'],
'email' => $data['email'],
// password DI-HASH dulu!
'password' => Hash::make($data['password']),
]);
return redirect('/login');
}
public function login(Request $req){
$cred = $req->validate([
'email' => 'required|email',
'password' => 'required',
]);
// Auth::attempt cek & cocokkan hash
if(Auth::attempt($cred)){
$req->session()->regenerate();
return redirect('/dashboard');
}
return back()->withErrors([
'email' => 'Email atau password salah.',
]);
}
Auth::attempt() otomatis mengambil hash dari DB lalu membandingkannya dengan password yang diketik. Kamu tidak perlu cek manual — dan password asli tidak pernah tersimpan.
Keluar dari sesi, dan memulihkan akun yang lupa password lewat token yang dikirim via email.
public function logout(Request $req){
Auth::logout();
$req->session()->invalidate();
$req->session()->regenerateToken();
return redirect('/');
}
// Kirim link reset ke email
public function forgot(Request $req){
$req->validate(['email'=>'required|email']);
Password::sendResetLink(
$req->only('email')
);
return back()->with('status','Link terkirim!');
}
Token reset bersifat unik & sementara (kadaluarsa ~60 menit). Ini memastikan hanya pemilik email asli yang bisa mengganti password — bukan orang lain yang menebak.
Middleware adalah "petugas" yang memeriksa setiap request sebelum sampai ke controller.
Wajib sudah login.
Hanya untuk yang belum login.
Cek peran (admin/staff).
Cek izin spesifik.
Route::middleware(['auth'])->group(function(){
Route::get('/dashboard', [DashboardC::class,'index']);
// hanya admin yang boleh
Route::middleware('role:admin')->group(function(){
Route::resource('/users', UserController::class);
});
});
Bayangkan gedung dengan petugas keamanan di tiap pintu. Pintu 1 cek "sudah login?", pintu 2 cek "kamu admin?", pintu 3 cek "boleh hapus data?". Jika satu pintu menolak, kamu tidak pernah sampai ke ruangan tujuan.
Create, Read, Update, Delete — empat operasi dasar mengelola data pengguna.
// READ — tampilkan semua user
public function index(){
$users = User::latest()->paginate(10);
return view('users.index', compact('users'));
}
// CREATE — simpan user baru
public function store(Request $r){
User::create($r->validate([
'name'=>'required', 'email'=>'required|email|unique:users',
]));
return to_route('users.index');
}
// DELETE — hapus user
public function destroy(User $user){
$user->delete();
return back();
}
| Nama | Role | Status | |
|---|---|---|---|
| Andi Saputra | andi@sekolah.id | Admin | ● Aktif |
| Bunga Lestari | bunga@sekolah.id | Guru | ● Aktif |
| Citra Dewi | citra@sekolah.id | Guru | ● Nonaktif |
| Dimas Pratama | dimas@sekolah.id | Siswa | ● Aktif |
CRUD itu seperti mengelola buku absensi: menambah nama siswa baru (Create), membaca daftar (Read), mengoreksi data salah (Update), dan mencoret yang pindah sekolah (Delete).
Role = jabatan. Permission = izin spesifik. Semakin tinggi role, semakin banyak izin.
Hierarki Role (berputar 3D)
| Permission | Admin | Guru | Siswa |
|---|---|---|---|
| Lihat Data | ✓ | ✓ | ✓ |
| Input Nilai | ✓ | ✓ | ✗ |
| Kelola User | ✓ | ✗ | ✗ |
| Hapus Data | ✓ | ✗ | ✗ |
Kepala Sekolah (Admin) bisa apa saja. Guru bisa input nilai tapi tak bisa mengangkat guru baru. Siswa hanya bisa melihat nilainya sendiri. Itulah Role & Permission.
Hashing mengubah password menjadi kode acak satu arah — tidak bisa dikembalikan ke aslinya.
// Membuat hash saat register
$hash = Hash::make('rahasia123');
// => $2y$10$N9qo8uLOickgx2ZMRZ...
// Mengecek saat login (TIDAK di-decrypt!)
if(Hash::check('rahasia123', $hash)){
// cocok → boleh login
}
Jika database bocor, hacker hanya mendapat hash acak — bukan password asli. Bahkan admin tidak bisa "membaca" password user. Saat login, sistem mem-hash ulang input lalu membandingkan, bukan men-decrypt.
Menggiling biji kopi jadi bubuk itu mudah, tapi mengubah bubuk kembali jadi biji utuh itu mustahil. Hashing sama: password → hash itu satu arah, tidak bisa "dimentahkan" lagi.
Tiga ancaman umum dan cara mencegahnya di Laravel.
Cross-Site Request Forgery — penyerang membuat kamu mengirim request tanpa sadar.
Cegah: @csrf token di tiap form.
Pastikan data masuk benar & aman sebelum diproses.
Cegah: $req->validate([...])
Cross-Site Scripting — penyerang menyisipkan script jahat lewat input.
Cegah: escape output {{ $data }}
<form method="POST" action="/students">
@csrf {{-- Token anti-CSRF --}}
<input name="nama" required>
</form>
{{-- Output otomatis di-escape → aman dari XSS --}}
<p>{{ $student->nama }}</p>
Seseorang memalsukan tanda tanganmu lalu mengirim surat ke bank atas namamu. Token CSRF = stempel rahasia yang hanya kamu tahu, jadi pemalsuan ketahuan.
Seseorang menyembunyikan "racun" (script jahat) dalam makanan (input). Escaping = mengubah racun jadi tidak aktif sebelum disajikan ke pengunjung lain.
Menyaring ribuan data agar pengguna cepat menemukan yang dicari.
public function index(Request $r){
$query = Student::query();
// SEARCH berdasarkan nama
if($r->filled('q')){
$query->where('nama', 'like', '%'.$r->q.'%');
}
// FILTER berdasarkan kelas
if($r->filled('kelas')){
$query->where('kelas', $r->kelas);
}
return view('students.index', [
'students' => $query->paginate(10),
]);
}
Search & Filter bekerja seperti saringan kopi: tuang semua data, hanya yang memenuhi kriteria (ampas yang sesuai ukuran) yang lolos ke hasil akhir.
Mengelola data dalam jumlah besar dengan rapi dan efisien.
Pecah data jadi halaman kecil agar ringan dimuat.
Urutkan A–Z, terbaru, atau nilai tertinggi.
Pilih banyak baris, lakukan aksi sekaligus.
// SORTING + PAGINATION
$students = Student::orderBy($r->get('sort','nama'), 'asc')
->paginate(10);
// BULK DELETE — hapus banyak sekaligus
public function bulkDelete(Request $r){
Student::whereIn('id', $r->ids)->delete();
return back()->with('ok', count($r->ids).' data dihapus');
}
Pagination seperti membagi buku 1000 halaman jadi bab-bab. Kamu tak perlu baca semua sekaligus — cukup buka halaman yang dibutuhkan.
Kartu ringkasan yang menampilkan angka penting secara cepat dan visual.
Statistic card adalah "dashboard mobil" dari aplikasi — sekali lihat, admin langsung tahu kondisi sistem tanpa membaca data mentah satu per satu. Angka berhitung dari 0 untuk menarik perhatian.
Visualisasi tren dan riwayat aktivitas terbaru pengguna.
Memberi tahu pengguna tentang kejadian penting secara real-time.
Badge merah menandakan ada 3 notifikasi belum dibaca. Lonceng bergetar menarik perhatian.
public function index(){
$notif = auth()->user()->unreadNotifications();
return response()->json([
'count' => $notif->count(), // badge counter
'items' => $notif->take(5),
]);
}
Notifikasi seperti kotak surat dengan bendera merah: saat bendera naik (badge muncul), kamu tahu ada pesan baru tanpa harus membuka kotaknya dulu.
Menggabungkan semua yang dipelajari menjadi satu aplikasi nyata.
Authentication + reset password.
Admin, Guru, Siswa.
Statistik per peran.
Siswa, Guru, Nilai.
Laporan nilai & absensi.
Hashing, CSRF, validasi.
Struktur tabel dan bagaimana sistem mengarahkan user sesuai perannya setelah login.
Setelah login sukses, sistem mengecek role lalu mengarahkan ke dashboard yang sesuai — seperti petugas bandara mengarahkan penumpang ke gate berbeda sesuai tiketnya.
Semua yang sudah kamu kuasai dalam satu pandangan.
Kamu kini paham fondasi bagaimana setiap aplikasi nyata (Gojek, Tokopedia, e-learning sekolah) menjaga akun jutaan penggunanya. Lanjutkan ke 3 tugas untuk membuktikan kemampuanmu!
Bangun sistem login & register sederhana lengkap dengan keamanan dasar.
User mendaftar → diarahkan ke login → masuk dashboard yang menyapa "Halo, [Nama]" → bisa logout. Saat password salah, muncul pesan error yang jelas.
| Kriteria | Bobot | Indikator |
|---|---|---|
| Register & Login berfungsi | 40% | Bisa daftar, login, logout tanpa error |
| Password di-hash | 30% | DB menyimpan hash, bukan teks asli |
| Validasi & CSRF | 20% | Form tervalidasi & ada @csrf |
| Tampilan rapi | 10% | UI bersih & mudah dipakai |
Kembangkan sistem login agar mendukung banyak peran dengan hak akses berbeda.
Login sebagai admin → masuk Dashboard Admin dengan menu "Kelola User". Login sebagai siswa → masuk Dashboard Siswa tanpa menu tersebut. Akses paksa halaman admin oleh siswa → ditolak (403).
| Kriteria | Bobot | Indikator |
|---|---|---|
| Multi-role berfungsi | 35% | 3 role bisa login & dibedakan |
| Middleware role | 35% | Akses tidak sah ditolak (403) |
| Redirect sesuai role | 20% | Tiap role ke dashboard yang benar |
| Dokumentasi | 10% | README menjelaskan cara pakai |
Proyek akhir — gabungkan seluruh materi BAB 11 menjadi satu sistem utuh.
Aplikasi web fungsional + video demo 3–5 menit + source code di GitHub dengan README. Presentasikan alur dari login hingga laporan.
| Kriteria | Bobot | Indikator |
|---|---|---|
| Authentication & Role | 25% | Login multi-role aman berfungsi |
| CRUD Profesional | 30% | Search, filter, pagination jalan |
| Dashboard & Reporting | 25% | Chart & laporan akurat |
| Security | 10% | Hashing, CSRF, validasi diterapkan |
| Presentasi & Dokumentasi | 10% | Demo jelas & README lengkap |